package com.tbit.uqbike.webmanager.controller;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.tbit.uqbike.object.pojo.vo.BatteryLogCountVO;
import com.tbit.uqbike.object.pojo.vo.BatteryLogExportVO;
import com.tbit.uqbike.object.pojo.vo.BatteryLogVO;
import com.tbit.uqbike.object.pojo.vo.BatteryOperationCountVO;
import com.tbit.uqbike.object.view.JsonResult;
import com.tbit.common.entity.view.PageResult;
import com.tbit.common.entity.view.Result;
import com.tbit.uqbike.service.business.BatteryLogService;
import com.tbit.uqbike.webmanager.util.excel.ExcelUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import javax.validation.constraints.NotNull;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


/**
 * 电池操作记录
 *
 * @Author:BUGTian
 * @DATE: 2022/5/12
 */
@RestController
@RequestMapping("/batteryLog")
public class BatteryLogController {

    @Autowired
    private BatteryLogService batteryLogService;

    /**
     * 分页查询电池操作记录
     *
     * @param page          当前页码
     * @param size          每页显示的行
     * @param accountId 区域id
     * @param startTime     开始时间
     * @param endTime       结束时间
     * @param accountUserId 操作人员id
     * @param batteryNO     电池编号
     * @return 电池操作记录
     */
    @GetMapping("/queryPage")
    public Result<PageResult<BatteryLogVO>> queryPage(@Valid @NotNull Integer page, @NotNull Integer size,
                                                      @NotNull(message = "ver.accountId.notNull")  Integer accountId,
                                                      @NotNull(message = "时间不能为空") Date startTime,
                                                      @NotNull(message = "时间不能为空") Date endTime, Integer accountUserId,
                                                      String batteryNO) {
        //校验时间 不允许超过31天
        if (DateUtil.between(startTime, endTime, DateUnit.DAY) > 31) {
            return Result.error("查询时间范围过大，请缩小查询范围");
        }
        PageResult<BatteryLogVO> pageResult = batteryLogService.queryPage(page, size, accountId, startTime, endTime, accountUserId, batteryNO);
        return Result.success(pageResult);
    }

    /**
     * 电池出入库统计图表
     *
     * @param accountId     区域id
     * @param startTime     开始时间
     * @param endTime       结束时间
     * @param accountUserId 操作人员id
     * @return
     */
    @GetMapping("/queryBatteryMapCount")
    public Result<List<BatteryOperationCountVO>> queryBatteryOperationCount(@Valid @NotNull(message = "ver.accountId.notNull") Integer accountId,
                                                                            @NotNull Date startTime, @NotNull Date endTime, Integer accountUserId) {
        List<BatteryOperationCountVO> batteryOperationCountVOS = batteryLogService.queryBatteryOperationCount(accountId, startTime, endTime, accountUserId);
        return Result.success(batteryOperationCountVOS);
    }

    /**
     * 电池出入库统计详情
     *
     * @param page          当前页码
     * @param size          每页显示的行
     * @param accountId     区域id
     * @param startTime     开始时间
     * @param endTime       结束时间
     * @param accountUserId 操作人员id
     * @param type          操作类型
     * @return
     */
    @GetMapping("/queryDetails")
    public Result<PageResult<BatteryLogVO>> queryDetails(@NotNull Integer page, @NotNull Integer size, @NotNull(message = "ver.accountId.notNull") Integer accountId, @NotNull Date startTime, @NotNull Date endTime, Integer accountUserId, Integer type) {
        PageResult<BatteryLogVO> pageResult = batteryLogService.queryDetails(page, size, accountId, startTime, endTime, accountUserId, type);
        return Result.success(pageResult);
    }

    /**
     * 电池出入库统计详情导出
     *
     * @param accountId     区域id
     * @param startTime     开始时间
     * @param endTime       结束时间
     * @param accountUserId 操作人员id
     * @param type          操作类型
     * @return
     */
    @GetMapping("/exportDetails")
    public Result exportDetails(@NotNull(message = "ver.accountId.notNull") Integer accountId, @NotNull Date startTime, @NotNull Date endTime, Integer accountUserId, Integer type, HttpServletResponse response) {
        PageResult<BatteryLogVO> pageResult = batteryLogService.queryDetails(1, 65535, accountId, startTime, endTime, accountUserId, type);
        List<BatteryLogVO> list = pageResult.getList();
        ExcelUtil<BatteryLogVO> excel = new ExcelUtil<>(BatteryLogVO.class);
        JsonResult batteryDetail = excel.exportExcel(list, "电池出入库统计详情");
        return Result.success(batteryDetail.getData());
    }

    /**
     * 电池出入库总览
     *
     * @param page          当前页码
     * @param size          每页显示的行
     * @param accountId     区域id
     * @param startTime     开始时间
     * @param endTime       结束时间
     * @param accountUserId 操作人员id
     * @return
     */
    @GetMapping("/queryOverview")
    public Result<PageResult<BatteryLogCountVO>> queryOverview(@NotNull Integer page, @NotNull Integer size, @NotNull(message = "ver.accountId.notNull") Integer accountId, @NotNull Date startTime, @NotNull Date endTime, Integer accountUserId) {
        if (page == null || size == null) {
            return Result.error("分页参数有误!");
        }
        PageResult<BatteryLogCountVO> pageResult = batteryLogService.queryOverview(page, size, accountId, startTime, endTime, accountUserId);
        return Result.success(pageResult);
    }

    /**
     * 电池出入库总览导出
     *
     * @param accountId     区域id
     * @param startTime     开始时间
     * @param endTime       结束时间
     * @param accountUserId 操作人员id
     * @return
     */
    @GetMapping("/exportOverview")
    public Result exportOverview(@NotNull(message = "ver.accountId.notNull") Integer accountId, @NotNull Date startTime, @NotNull Date endTime, Integer accountUserId) {
        PageResult<BatteryLogCountVO> pageResult = batteryLogService.queryOverview(1, 65535, accountId, startTime, endTime, accountUserId);
        List<BatteryLogCountVO> list = pageResult.getList();
        ExcelUtil<BatteryLogCountVO> excel = new ExcelUtil<>(BatteryLogCountVO.class);
        JsonResult batteryDetail = excel.exportExcel(list, "电池出入库统计总览");
        return Result.success(batteryDetail.getData());
    }

    /**
     * 电池操作日志导出
     *
     * @param accountId     区域id
     * @param startTime     开始时间
     * @param endTime       结束时间
     * @param accountUserId 运维人员id
     * @param batteryNO     电池编号
     * @return result
     */
    @GetMapping("/exportBattery")
    public Result<Object> exportBattery(@NotNull(message = "ver.accountId.notNull")  Integer accountId, @NotNull Date startTime, @NotNull Date endTime, Integer accountUserId, String batteryNO) {
        //校验时间 不允许超过31天
        if (DateUtil.between(startTime, endTime, DateUnit.DAY) > 31) {
            return Result.error("查询时间范围过大，请缩小查询范围");
        }
        PageResult<BatteryLogVO> pageResult = batteryLogService.queryPage(1, 65535, accountId, startTime, endTime, accountUserId, batteryNO);
        List<BatteryLogVO> list = pageResult.getList();
        List<BatteryLogExportVO> exportVOList = new ArrayList<>();
        for (BatteryLogVO batteryLogVO : list) {
            BatteryLogExportVO batteryLogExportVO = new BatteryLogExportVO();
            BeanUtil.copyProperties(batteryLogVO, batteryLogExportVO);
            exportVOList.add(batteryLogExportVO);
        }
        ExcelUtil<BatteryLogExportVO> excelUtil = new ExcelUtil<>(BatteryLogExportVO.class);
        JsonResult result = excelUtil.exportExcel(exportVOList, "电池操作日志");
        return Result.success(result.getData());
    }

}
